#include <stdio.h>
#include <string>
#include <iostream>

using namespace std;

int printInfo(const std::string info, const std::string title, int value)
{
    std::cout << "###" << title << "###[" << info << "][" << value << "]" << std::endl;
    return value;
}

class A
{
public:
    int m_x;
    int m_z;

public:
    // A(int x)
    //     : m_x(printInfo("Init A::m_x", "父类成员变量m_x初始化", x)), m_z(printInfo("Init A::m_z", "父类成员变量m_z初始化", -1))
    // {
    //     printInfo("Call A::A(int x)", "父类构造函数", m_x);
    //     printInfo("A::m_x", "成员变量", m_x);
    //     printInfo("A::m_z", "成员变量", m_z);
    // }
    A(int x, int z)
        : m_x(printInfo("Init A::m_x", "父类成员变量m_x初始化", x)), m_z(printInfo("Init A::m_z", "父类成员变量m_z初始化", z))
    {
        printInfo("Call A::A(int x,int z)", "父类构造函数", m_x);
        printInfo("A::m_x", "成员变量", m_x);
        printInfo("A::m_z", "成员变量", m_z);
    }

public:
    int getPrivateValue()
    {
        return m_private_value;
    }
    void setPrivateValue(int value)
    {
        m_private_value = value;
    }

private:
    int m_private_value;
};

class A1 : public A
{
public:
    int m_x;
    int m_y;
    int m_private_value;

public:
    // A1(int x)
    //     : A(x), m_y(printInfo("Init A1::m_y", "子类成员变量m_y初始化", x))
    //     //, m_z(printInfo("Init A::m_z", "父类成员变量m_z初始化", -1))
    // {
    //     printInfo("Call A1::A1(int x)", "子类构造函数", m_x);
    //     printInfo("A1::m_x", "成员变量", m_x);
    //     printInfo("A1::m_y", "成员变量", m_y);
    //     printInfo("A1::m_z", "成员变量", m_z);
    // }
    A1(int x, int y)
        : A(y, x), m_x(printInfo("Init A1::m_x", "子类成员变量m_x初始化", x)), m_y(printInfo("Init A1::m_y", "子类成员变量m_y初始化", y))
    //, m_z(printInfo("Init A::m_z", "父类成员变量m_z初始化", -1))
    {
        printInfo("Call A1::A1(int x, int y)", "子类构造函数", m_x);
        printInfo("A1::m_x", "成员变量", m_x);
        printInfo("A::m_x", "成员变量", ((A *)this)->m_x); //变量重名时，其实A1中有两个m_x的存储空间。一个属于A，一个属于A1
        printInfo("A1::m_y", "成员变量", m_y);
        printInfo("A1::m_z", "成员变量", m_z);
    }

public:
    void showPrivateValue()
    {
        printf("privateValue：%d\n", getPrivateValue());
        printf("m_private_value: %d\n", m_private_value);
    }
};

//测试如何调用父类构造函数
void callParentConstructorTest()
{
    // printf("--------------------------------\n");
    // A1 a = A1(1);
    printf("--------------------------------\n");
    A1 a1 = A1(2, 3);
    printf("--------------------------------\n");

    a1.setPrivateValue(1);
    a1.m_private_value = 2;
    a1.showPrivateValue();
    a1.setPrivateValue(3);
    a1.m_private_value = 4;
    a1.showPrivateValue();
}

int main(int argn, char **argv)
{
    callParentConstructorTest();

    printf("Hello World!\n");
    return 0;
}